package com.kizuki.design.factory;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@Slf4j
@Component
public class PayFactory {

    /**
     * 当注入一个Map的时候 ，value的泛型为PayStrategy，则注入后Spring会将实例化后的bean放入value ，key则为注入后bean的名字
     * 当注入一个List的时候，List的泛型为PayStrategy，则注入后Spring会将实例化的bean放入List中
     * 也可以每个策略@PostConstruct主动将策略存到工厂的map, 这样的key值可以更灵活, 可扩展性好
     */
    @Autowired
    private Map<String, PayStrategy> payStrategyMap = new HashMap<>();


    private static final PayStrategy DEFAULT_STRATEGY = originalPrice -> originalPrice;

    public PayStrategy getStrategy(String payName) {
        PayStrategy strategy = payStrategyMap.get(payName);
        if (Objects.isNull(strategy)) {
            log.error("不支持该策略, 使用默认的策略类!");
            return DEFAULT_STRATEGY;
        }
        return strategy;
    }


}
